# -*- coding: utf-8 -*-

"""
Date: 2023/3/7 10:40
Author: Darker
"""
import os
import traceback
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from typing import Text, List, NoReturn
import smtplib

from config import conf
from log import logger
from utils import date_utils, g


def __format_addr(address: Text) -> Text:
    """
    解析邮件地址，保证邮件有别名可以显示
    :param address: 邮件地址
    :return:
    """
    # 解析邮件地址，保证有别名可以显示
    aliasName, address = parseaddr(address)
    # 防止中文问题，进行转码处理，并格式化为str
    return formataddr((Header(aliasName, charset="UTF-8").encode(), address))


def send_email() -> NoReturn:
    """
    发送邮件
    """
    user = g.emailUser
    passwd = g.emailPassword
    addresseeList = g.addressList
    mailCCList = g.mailCCList
    smtpServer = g.smtpServer
    numbs = g.emailData
    valueList = g.listVals
    def check1(image_name, site):  # 检测图片是否存在,根据结果选择HTML代码
        """
        image_name:图片名称
        site：用于生成html的图片展位符
        """
        if os.path.exists(os.path.join(conf.pictureDir, image_name)):
            return f'<p><img src="cid:{site}"></p>'
        match image_name:
            case '里程碑截图.png':
                return ''
            case '每日新增BUG数趋势图.png':
                return '<p>暂无BUG记录</p>'
            case _:
                return '<p>暂无</p>'

    # 邮件实际发送日期的下一个工作日
    next_workday = date_utils.next_work_day()

    html_style = '''
        <style>
    			#mingpian{
    				width:350px;
    				height:110px;
    				border-radius:5px;
    				background-color:#2F4F4F;
    				font-family:"微软雅黑";
    			}
    			#msg {
    				width:350px;
    				height:30px;
    				font-size:16px;
    				color:#000000	;
    				padding-top:10px;
    				background-color:#F5F5F5;
    			}
    			#msg mail{
    				float:center;
    				font-family:STLiti,FZShuTi,STHupo,STXinwei,"Simhei",STKaiti;
    				font-size:22px;
    				font-weight:bold;	
    			}
    			#logoimg{
    				padding-top:10px;
    				float:center;
    				width:350px;
    				height:80px;
    			}
    			#logoimg img{
    				width:200px;
    				height:30px;
    			}
    			.clearDiv{clear:both;}
    		</style>
    '''
    html = f'''
        <html>
        <head></head>
        <body>
        <pre>{valueList[0]}</pre>
        <hr style="height:1px;border:none;border-top:1px solid #DCDCDC;" align="left"/>
        <h2>一、里程碑总体进度</h2>
        <a href={valueList[4]} target="_blank" title={valueList[4]}>{valueList[4]}</a><br/>
        {valueList[5]}
        {check1('里程碑截图.png', 'image8')}
        <h2>二、每日BUG趋势</h2>
        <p><b>每日新增缺陷趋势，期间累计总数： {numbs[0]}</b></p>
        {check1('每日新增BUG数趋势图.png', 'image1')}    
        <p><b>每日剩余缺陷趋势：{numbs[8] + numbs[9]}</b></p>
        {check1('每日剩余BUG趋势图.png', 'image14')}
        <h2>三、阻塞问题：{numbs[3]}</h2>
        {numbs[4]}
        <h2>四、待解决的重新打开状态BUG：{numbs[5]}，已定性的返工bug数共计：{numbs[11]}</h2>
        {numbs[6]}
        {check1('重复打开BUG数对应开发人员分布图.png', 'image13')}
        <h2>五、今日测试投入情况：{valueList[3]}人天</h2>
        <pre>{valueList[1]}</pre>
        <h2>六、开发+需求缺陷数据统计</h2>
        <p><b>今日新增BUG：{numbs[7]}</b></p>
        {check1('今日产生BUG数分布图.png', 'image4')}
        <p><b>今日解决BUG：{numbs[1]}</b></p>
        {check1('今日解决BUG数分布图.png', 'image3')}
        <p><b>待解决BUG：{numbs[9]}</b></p>
        {check1('待解决BUG对应处理人分布图.png', 'image2')}
        <p><b>累计解决BUG：{numbs[2]}</b></p>
        {check1('累计解决BUG分布图.png', 'image5')}
        <p><b>累计BUG：{numbs[0]}</b></p>
        {check1('累计BUG对应处理人分布图.png', 'image6')}
        {check1('累计BUG对应开发人员分布图.png', 'image12')}
        <h2>七、测试缺陷数据统计</h2>
        <p><b>今日创建BUG：{numbs[7]}</b></p>
        {check1('今日创建BUG数分布图.png', 'image7')}
        <p><b>今日关闭BUG：{numbs[10]}</b></p>
        {check1('今日关闭BUG数分布图.png', 'image9')}
        <p><b>待处理BUG：{numbs[8]}</b></p>
        {check1('待处理BUG对应处理人分布图.png', 'image10')}
        <p><b>测试创建BUG总数：{numbs[0]}</b></p>
        {check1('创建BUG总数分布图.png', 'image11')}
        <hr style="height:1px;border:none;border-top:1px solid #DCDCDC;" align="left"/>
        <h2>明日（{next_workday}）测试计划：</h2>
        <pre>{valueList[2]}</pre>
        <br />
        <br />
    	<hr style="height:1px;border:none;border-top:1px solid #B5C4DF;" width="350" align="left"/>
    	<body align="left">
    		<div id="mingpian"  align="center">
    			<div id="msg">
    				<a><mail>{user}</mail></a>
    			</div>
    			<div id="logoimg">
    				<a href="http://ztessc.cn/"><img src="http://qty83k.creatby.com/materials/33005/hd/5792bc4acc4bc84aeb64f29795ef5561_4096.png"/></a>
    		    </div>
                {html_style}
    			<div class="clearDiv"></div>
    		</div>
    	</body>
        </body>
        </html>
        <style>
            table,table tr th, table tr td {{ border:1px solid #0094ff; }}
            table {{ border-collapse: collapse; }}  
        </style>
        '''
    SMTP_PORT = 25
    msg = MIMEMultipart()
    msg.attach(MIMEText(html, 'html', 'utf-8'))

    def add_images(image_location, image_id):
        fp = open(image_location, 'rb')
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header('Content-ID', image_id)
        return msgImage

    # 按位置给邮件插入图片
    def check(a, b):  # 如果图片存在,则添加图片到邮件
        if os.path.exists(a):
            msg.attach(add_images(a, b))

    check(os.path.join(conf.pictureDir, '每日新增BUG数趋势图.png'), 'image1')
    check(os.path.join(conf.pictureDir, '每日剩余BUG趋势图.png'), 'image14')
    check(os.path.join(conf.pictureDir, '里程碑截图.png'), 'image8')
    # 开发
    check(os.path.join(conf.pictureDir, '待解决BUG对应处理人分布图.png'), 'image2')
    check(os.path.join(conf.pictureDir, '今日解决BUG数分布图.png'), 'image3')
    check(os.path.join(conf.pictureDir, '今日产生BUG数分布图.png'), 'image4')
    check(os.path.join(conf.pictureDir, '累计解决BUG分布图.png'), 'image5')
    check(os.path.join(conf.pictureDir, '累计BUG对应处理人分布图.png'), 'image6')
    check(os.path.join(conf.pictureDir, '累计BUG对应开发人员分布图.png'), 'image12')
    check(os.path.join(conf.pictureDir, '重复打开BUG数对应开发人员分布图.png'), 'image13')
    # 测试
    check(os.path.join(conf.pictureDir, '今日创建BUG数分布图.png'), 'image7')
    check(os.path.join(conf.pictureDir, '今日关闭BUG数分布图.png'), 'image9')
    check(os.path.join(conf.pictureDir, '待处理BUG对应处理人分布图.png'), 'image10')
    check(os.path.join(conf.pictureDir, '创建BUG总数分布图.png'), 'image11')
    # 格式化展示收件人
    strFrom = __format_addr(user)
    msg['From'] = strFrom

    # 格式化展示发件人
    # 原来是一个纯邮箱的list，现在如果是一个["jaychen<jaychen@jay.com>"]的list给他格式化
    strTo = map(__format_addr, addresseeList)
    msg['To'] = ','.join(strTo)  # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”

    # 格式化展示抄送人
    # 原来是一个纯邮箱的list，现在如果是一个["jaychen<jaychen@jay.com>"]的list给他格式化
    strCC = map(__format_addr, mailCCList)
    msg['cc'] = ','.join(strCC)

    msg['Subject'] = valueList[6]  # "中兴新云测试日报"  # 构建msg对象的邮件主题

    try:
        smtpServer = smtplib.SMTP(smtpServer, SMTP_PORT)  # 连接SMTP服务器
    except Exception as err:
        logger.error(f'\n邮件发送失败，请确认[邮件服务器地址]是否可连接。\n错误信息：{err}')
        logger.error(traceback.format_exc())
        return
    else:
        addresseeList.extend(mailCCList)  # 最终收件人  收件人+抄送人
        addresseeAll = list(set(addresseeList))
        smtpServer.ehlo()
        smtpServer.starttls()
        smtpServer.ehlo()
        smtpServer.login(user, passwd)
        smtpServer.sendmail(user, addresseeAll, msg.as_string())
        return True
    finally:
        smtpServer.quit()
